package com.zhouhong.muke_leetcode;

/**
 * @ClassName: Algorithm-and-Data-Structure
 * @Description:
 * @Author: zhouhong
 * @Create: 2021-04-04 00:17
 **/
//给你两个有序整数数组 nums1 和 nums2，请你将 nums2 合并到 nums1 中，使 nums1 成为一个有序数组。
//
// 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n，这样它就有足够的空间保存来自 nu
//ms2 的元素。

public class LeetCode0088 {
    // 从后到前双指针操作两个数组
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // i 指向 num1 尾部，j 指向 num2 尾部，k 指向两者合并后的尾部
        int i = m - 1, j = n - 1, k = m + n -1;
        // 两个数组都不为空
        while (i >= 0 && j >= 0){
            // 数组二最后一个元素大于数组一的最后一个元素，说明num2[j]为最终的最大数，直接放到最后面。
            if (nums2[j] > nums1[i]){
                nums1[k] = nums2[j];
                k --;
                j --;
            }else {
            // 反则：将num1最后一个数移动到最后面
                nums1[k] = nums1[i];
                k --;
                i --;
            }
        }
        // num1 不为空，num2为空,这里可以直接返回num1,但是题中没有返回
        while (i >= 0){
            nums1[k] = nums1[i];
            k --;
            i --;
        }
        // num1 为空，num2不为空
        while (j >= 0){
            nums1[k] = nums2[j];
            k --;
            j --;
        }
    }


}
